package de.jungblut.online.ml; import java.util.Optional; import java.util.function.Supplier; import java.util.stream.Stream; import com.google.common.annotations.VisibleForTesting; import com.google.common.base.Preconditions; public abstract class AbstractOnlineLearner<M extends Model> implements OnlineLearner<M> { protected Supplier<Stream<FeatureOutcomePair>> streamSupplier; protected boolean verbose; protected int featureDimension; protected int outcomeDimension; protected int numOutcomeClasses; protected void init(Supplier<Stream<FeatureOutcomePair>> streamSupplier) { this.streamSupplier = streamSupplier; peekDimensions(this.streamSupplier); } /** * Peeks for the feature and outcome dimensions. * * @param streamSupplier the supplier that gets streams. */ @VisibleForTesting protected void peekDimensions( Supplier<Stream<FeatureOutcomePair>> streamSupplier) { Stream<FeatureOutcomePair> stream = Preconditions.checkNotNull( streamSupplier.get(), "Supplied a null stream!"); Optional<FeatureOutcomePair> first = stream.findFirst(); if (!first.isPresent()) { throw new IllegalArgumentException("Supplied an empty stream!"); } FeatureOutcomePair firstExample = first.get(); this.featureDimension = firstExample.getFeature().getDimension(); this.outcomeDimension = firstExample.getOutcome().getDimension(); this.numOutcomeClasses = Math.max(2, this.outcomeDimension); } public void verbose() { this.verbose = true; } public void setVerbose(boolean verbose) { this.verbose = verbose; } }